#ifndef __STREAM_IN_MANSGER_H__
#define __STREAM_IN_MANSGER_H__


#ifdef __cplusplus
extern "C" {
#endif

#define MAX_STREAM_NUM 16


typedef enum
{
    IDLE = 0,
    RUNNING,
}PlayState;

typedef enum
{
    USBTYPEC_OUT = 0, 
    SD_OUT,  
    MIRROR_OUT,
    HDMI_OUT,
    BYOM_OUT,
    RTSP_MAIN_OUT,
    RTSP_SUB_OUT1, //mainstream 640*360 on curtain num 98
    RTSP_SUB_OUT2, // hdmi 1080p on curtain num 98
    RTSP_SUB_OUT3, // hdmi 640*360 on curtain num 98
    RTSP_SUB_OUT4, // video camera  on curtain num 98
    RTSP_SUB_OUT5, // video camera  on curtain num 98

    USBTYPEA_OUT1, //USBTYPEA_OUT1及以下为纯音频输出接口
    USBTYPEA_OUT2, 
    LINE_OUT, //LINE_OUT及以下的音频直接输出，其他音频输出到编码模块
    BLUETOOTH_OUT,
    HORN_OUT,
    MAX_INTERFACE_NUM = 16		///<最大流输出接口类型
}StreamOutInterface;

typedef enum{
    RTSP_SUB_OUT6 = 2, // video camera  on curtain num 98
    RTSP_SUB_OUT7 = 4, // video camera  on curtain num 98
    RTSP_SUB_OUT8 = 1, // audio only  on curtain num 98   
}RtspChannel;

typedef enum
{
    RESOLUTION_720P = 0,
    RESOLUTION_1080P,
    RESOLUTION_4K
}ResolutionDef;

typedef enum
{
    INSIDE_STREAM = 0,
    MIRROR_STREAM,
    BYOM_STREAM,
    PICTUREFILE_STREAM,
    VIDEOFILE_STREAM,    
    USBTYPEAIN_STREAM,
    RTSP_STREAM,
    ONLINEMP4_STREAM,
    HDMIIN_STREAM,
    OSD_STREAM,
    LINEIN_STREAM,
    BLUETOOTH_STREAM,
    MIC_STREAM,
    USBTYPECIN_STREAM
}StreamInType;

/// 音视频流基本信息
typedef struct
{	
	int displayChn; ///< 显示通道
	StreamInType type;	///< 音视频流的类型,HDMI和OSD只能通过类型识别
	char content[256]; ///<可选字段，osd代表设置显示字符
	//int id; ///<可选字段，流的ID
	int reserved[6];		///< 保留
} StreamInfo;

/// 屏幕坐标
typedef struct
{	
	int left;
	int top;
	int width;
	int height;
} ScreenCodt;

/// 任务信息
typedef struct
{	
	int Sequence; ///< 播放次序
	int StartTime; ///< 播放起始时间，单位s
	int StopTime; ///< 播放结束时间，单位s
} TaskInfo;

///单路音频信息
typedef struct 
{
	StreamInfo audioStream;	///< 音频源信息
} AudioSingleInfo;

/// 音频混音信息
typedef struct 
{
    int sampleRate; ///<输出采样率
	int channelNum; ///<输出声道数	
	int totalInput;	///<音频混音路数
	AudioSingleInfo audioInfo[8]; ///< 单路音频流详细信息
} AudioMixerInfo;

///单路视频信息
typedef struct 
{
	int pictureNum; ///<画面编号
	int layerNum;   ///<所在层数
	StreamInfo videoStream;	///< 视频源信息
	ScreenCodt codt;    ///< 画面坐标信息
	TaskInfo task; ///< 画面任务信息
} VideoSingleInfo;

/// 视频拼接信息
typedef struct 
{
    int displayWidth;   ///<拼接画面宽
    int displayHeight;  ///<拼接画面高
    int displayFps;     ///<拼接画面显示帧率
	int totalPictures;	///<拼接画面个数
	VideoSingleInfo videoInfo[16]; ///<单路视频流详细信息
} VideoMixerInfo;

/// 不同输出接口的音视频源配置信息
typedef struct 
{	
	StreamOutInterface interface; ///<流输出接口类型
	VideoMixerInfo videoMixerInfo; ///<视频拼接信息	
	AudioMixerInfo audioMixerInfo;  ///<音频混音信息		
} StreamCofigInfo;

/// 场景幕墙信息
typedef struct 
{	
	int curtainNum; ///<场景编号
	int outNum; ///<输出接口配置个数
	StreamCofigInfo cofigInfo[MAX_INTERFACE_NUM]; ///<不同输出接口的音视频源配置信息
	int reserved[12];	///< 保留
} CurtainInfo;

/// 流播放策略
typedef struct 
{	
	int curtainNum; ///<场景编号
	int action ;   ///<播放动作
	int playMode;	///<流播放模式
}PlayStrategy;

///流播放能力
typedef enum 
{
    VIDEO_AUDIO = 0,
    VIDEO_ONLY,
    AUDIO_ONLY
}StreamAbility;

/// 音视频流播放信息
typedef struct 
{	
    StreamAbility playAbility; ///< 流播放能力
	int videoChn; ///< 视频配置通道
	int audioChn; ///< 音频配置通道
	StreamInfo stream; ///< 流基础信息
	TaskInfo task; ///< 流播放任务
}StreamPlayInfo;


/// 获取当前场景的流信息 
/// \param [in] streamType 0-视频，1-音频
/// \param [out] pStreamInfo 流信息
/// \param [out] streamNum 流路数
/// \retval <0 获取失败
/// \retval 0 获取成功
int getStreamInfo(int streamType, StreamInfo* pStreamInfo, int *streamNum);

/// 获取幕墙布局信息
/// \param [in] curtainInfo 当前播放的幕墙信息
/// \retval <0 获取失败
/// \retval 0 获取成功
int getCurtainLayout(CurtainInfo* pCurtainInfo);


/// 获取幕墙播放状态
/// \param [in] state 当前播放状态
/// \retval <0 获取失败
/// \retval 0 获取成功
int getCurtainPlayState(PlayState *state);

/// 获取AP与投屏相关信息
/// \param [in] info osd显示信息
/// \retval <0 获取失败
/// \retval 0 获取成功
int getDispayOsdInfo(char* info);


/// 获取投屏是否打开
/// \retval <0 获取失败
/// \retval 0 获取成功
int showOsdInfo();


/// 获取bgm场景是否设置
/// \param [out] state bgm场景设置状态
/// \retval <0 获取失败
/// \retval 0 获取成功
int getBgmCurtainState(int* state);


/// 判断byom输入视频是否直接发送
/// \retval <0 需解码发送
/// \retval 0 直接发送
int isVideoDirectTransfer();





#ifdef __cplusplus
}
#endif


#endif

